﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using clEntidad;
using System.Data.OleDb;
using System.Collections;

namespace clBD
{
    public class BDRegistroVehiculo:BDBase
    {
        public BDRegistroVehiculo(OleDbConnection cn):base(cn){ }
        public BDRegistroVehiculo(OleDbConnection cn, OleDbTransaction trx) : base(cn, trx) { }
        public int  grabar(RegistroVehiculo elemento, int idLogin)
        {
            elemento.id = getSeq("SEQ_REG_VEHICULO");
            String propio = elemento.vehiculo.tipo; 
            string campo = "ingreso";
            string campoLog = "id_login_entrega";
            string estado = "I";
            if (elemento.vehiculo.tipo.Equals( "C"))
            {
                campo = "salida";
                campoLog = "id_login_salida";
                estado = "S";
            }
            StringBuilder sbInsert = new StringBuilder();
            sbInsert.Append("insert into reg_vehiculo " +
                " (id,num_doc,ape_pat,ape_mat,nombres,empresa,"+campo+",id_loc,"+campoLog+"," +
                " vehiculo_placa,vehiculo_descrip,vehiculo_llanta_rpto,vehiculo_escalera_g," +
                " vehiculo_escalera_c,vehiculo_kilom_s,observ,propio,");
            if (elemento.vehiculo.tipo.Equals("C"))
                sbInsert.Append ("num_serie_out1,tipo_out1,marca_out1,modelo_out1,num_serie_out2,tipo_out2,marca_out2,modelo_out2) ");
            else
                sbInsert.Append ("num_serie_in1,tipo_in1,marca_in1,modelo_in1,num_serie_in2,tipo_in2,marca_in2,modelo_in2) ");
            sbInsert.Append(" values(" + elemento.id + ",'" + elemento.persona.numDoc.Trim().ToUpper() + "','"
                + elemento.persona.apePat.Trim().ToUpper() + "','"
                + elemento.persona.apeMat.Trim().ToUpper() + "','"
                + elemento.persona.nombres.Trim().ToUpper() + "','"
                + elemento.persona.empresa.Trim().ToUpper() + "'"
                + ",now,"
                + elemento.idLocal.ToString() + ","
                + idLogin
                + ",'" + elemento.vehiculo.placa
                + "','" + elemento.vehiculo.marca
                +"'," + elemento.vehiculo.llantaRpto.ToString()
                + "," + elemento.vehiculo.escaleraGrande.ToString()
                + "," + elemento.vehiculo.escaleraChica.ToString()
                + ","  +elemento.vehiculo.ultimoKilometraje.ToString()
                +",'"+ elemento.observaciones+"','" + propio
                + "','" + elemento.vehiculo.equipoIn1.numSerie
                + "','" + elemento.vehiculo.equipoIn1.tipo
                + "','" + elemento.vehiculo.equipoIn1.marca
                + "','" + elemento.vehiculo.equipoIn1.modelo
                + "','" + elemento.vehiculo.equipoIn2.numSerie
                + "','" + elemento.vehiculo.equipoIn2.tipo
                + "','" + elemento.vehiculo.equipoIn2.marca
                + "','" + elemento.vehiculo.equipoIn2.modelo
                + "')");

            execute(sbInsert.ToString());
            return elemento.id;
        }
        public int grabarInventario(RegistroVehiculo elemento, int idLogin)
        {
            elemento.id = getSeq("SEQ_REG_VEHICULO");
            String propio = elemento.vehiculo.tipo;
            StringBuilder sbInsert = new StringBuilder();
            sbInsert.Append("insert into reg_vehiculo " +
                " (id,num_doc_in,ape_pat_in,ape_mat_in,nombres_in,empresa_in,ingreso,id_loc,id_login_entrega," +
                " vehiculo_placa,vehiculo_descrip,vehiculo_llanta_rpto_in,vehiculo_escalera_g_in," +
                " vehiculo_escalera_c_in,vehiculo_kilom_i,observ_rev,propio,");
            sbInsert.Append("num_serie_in1,tipo_in1,marca_in1,modelo_in1,num_serie_in2,tipo_in2,marca_in2,modelo_in2) ");
            sbInsert.Append(" values(" + elemento.id + ",'" + elemento.persona.numDoc.Trim().ToUpper() + "','"
                + elemento.persona.apePat.Trim().ToUpper() + "','"
                + elemento.persona.apeMat.Trim().ToUpper() + "','"
                + elemento.persona.nombres.Trim().ToUpper() + "','"
                + elemento.persona.empresa.Trim().ToUpper() + "'"
                + ",now,"
                + elemento.idLocal.ToString() + ","
                + idLogin
                + ",'" + elemento.vehiculo.placa
                + "','" + elemento.vehiculo.marca
                + "'," + elemento.vehiculo.llantaRpto.ToString()
                + "," + elemento.vehiculo.escaleraGrande.ToString()
                + "," + elemento.vehiculo.escaleraChica.ToString()
                + "," + elemento.vehiculo.ultimoKilometraje.ToString()
                + ",'" + elemento.observacionesRev + "','" + propio
                + "','" + elemento.vehiculo.equipoIn1.numSerie
                + "','" + elemento.vehiculo.equipoIn1.tipo
                + "','" + elemento.vehiculo.equipoIn1.marca
                + "','" + elemento.vehiculo.equipoIn1.modelo
                + "','" + elemento.vehiculo.equipoIn2.numSerie
                + "','" + elemento.vehiculo.equipoIn2.tipo
                + "','" + elemento.vehiculo.equipoIn2.marca
                + "','" + elemento.vehiculo.equipoIn2.modelo
                + "')");

            execute(sbInsert.ToString());
            return elemento.id;
        }
        public RegistroVehiculo get(int id)
        {
            RegistroVehiculo elem = new RegistroVehiculo();
            String query 
                = "SELECT id,salida,num_doc, ape_pat,ape_mat,nombres,empresa," +
                "vehiculo_placa,vehiculo_descrip,vehiculo_llanta_rpto,vehiculo_escalera_g," +
                "vehiculo_escalera_c,vehiculo_kilom_s,observ," +
                "num_serie_in1,tipo_in1,marca_in1, modelo_in1,"+
                "num_serie_in2,tipo_in2,marca_in2, modelo_in2,"+
                "num_serie_out1,tipo_out1,marca_out1, modelo_out1,"+
                "num_serie_out2,tipo_out2,marca_out2, modelo_out2"+
                ",ingreso FROM "
                + "reg_vehiculo where id=?";

            OleDbCommand comm = new OleDbCommand(query, this.cn);

            comm.Parameters.Add(new OleDbParameter("id", OleDbType.Integer, 0, "id"));
            comm.Parameters["id"].Value = id;

            OleDbDataReader dr = comm.ExecuteReader();
            if (dr.Read())
            {
                elem.id = dr.GetInt32(0);
                if (!dr.IsDBNull(1))
                {
                    elem.salida = dr.GetDateTime(1);
                }
                elem.persona.numDoc = dr.GetString(2);
                elem.persona.apePat = dr.GetString(3);
                elem.persona.apeMat = dr.GetString(4);
                elem.persona.nombres = dr.GetString(5);

                elem.persona.empresa = dr.GetString(6);

                elem.vehiculo.placa = dr.GetString(7);
                elem.vehiculo.marca = dr.GetString(8);
                elem.vehiculo.llantaRpto = dr.GetInt16(9);
                elem.vehiculo.escaleraGrande = dr.GetInt32(10);
                elem.vehiculo.escaleraChica = dr.GetInt32(11);
                elem.vehiculo.ultimoKilometraje = dr.GetInt32(12);
                elem.observaciones = dr.GetString(13);
                //Laptops in y out
                //In 1
                if (!dr.IsDBNull(14))
                {
                    elem.equipoIngresa1 = new Equipo();
                    elem.equipoIngresa1.numSerie = dr.GetString(14);
                    elem.equipoIngresa1.tipo = dr.GetString(15);
                    elem.equipoIngresa1.marca = dr.GetString(16);
                    elem.equipoIngresa1.modelo = dr.GetString(17);
                }
                //In 2
                if (!dr.IsDBNull(18))
                {
                    elem.equipoIngresa2 = new Equipo();
                    elem.equipoIngresa2.numSerie = dr.GetString(18);
                    elem.equipoIngresa2.tipo = dr.GetString(19);
                    elem.equipoIngresa2.marca = dr.GetString(20);
                    elem.equipoIngresa2.modelo = dr.GetString(21);
                }

                //Out 1
                if (!dr.IsDBNull(22))
                {
                    elem.equipoSalida1  = new Equipo();
                    elem.equipoSalida1.numSerie = dr.GetString(22);
                    elem.equipoSalida1.tipo = dr.GetString(23);
                    elem.equipoSalida1.marca = dr.GetString(24);
                    elem.equipoSalida1.modelo = dr.GetString(25);
                }
                //Out 2
                if (!dr.IsDBNull(26))
                {
                    elem.equipoSalida2 = new Equipo();
                    elem.equipoSalida2.numSerie = dr.GetString(26);
                    elem.equipoSalida2.tipo = dr.GetString(27);
                    elem.equipoSalida2.marca = dr.GetString(28);
                    elem.equipoSalida2.modelo = dr.GetString(29);
                }
                if (!dr.IsDBNull(30))
                {
                    elem.entrada = dr.GetDateTime(30);
                }
            }
            return elem;
        }
        public void ingresoXXX(int id, int idLogin,int kilometrajeIngreso)
        {
            String update = "update reg_vehiculo set ingreso=now,id_login_entrega=?,vehiculo_kilom_i=? where id=?";

            OleDbCommand comm = new OleDbCommand(update, this.cn);

            OleDbParameter parIdLogin = new OleDbParameter("@id_login_entrega", OleDbType.BigInt);
            parIdLogin.Value = idLogin;
            comm.Parameters.Add(parIdLogin);

            OleDbParameter parKiloI = new OleDbParameter("@vehiculo_kilom_i", OleDbType.BigInt);
            parKiloI.Value = kilometrajeIngreso;
            comm.Parameters.Add(parKiloI);

            OleDbParameter parId = new OleDbParameter("@id", OleDbType.BigInt);
            parId.Value = id;
            comm.Parameters.Add(parId);

            comm.ExecuteNonQuery();
        }

        public void ingresoCorporativo(int idLogin, RegistroVehiculo elemento)
        {
            String update = "update reg_vehiculo set " +
                "ingreso=now,id_login_entrega=?,vehiculo_kilom_i=? ," +
                "vehiculo_llanta_rpto_in=?,vehiculo_escalera_g_in=?,vehiculo_escalera_c_in=?," +
                "num_doc_in=?,ape_pat_in=?,ape_mat_in=?,nombres_in=?,empresa_in=?,"+
                "num_serie_in1=?,tipo_in1=?,marca_in1=?,modelo_in1=?," +
                "num_serie_in2=?,tipo_in2=?,marca_in2=?,modelo_in2=?," +
                "observ_rev=?" + 
                " where id=?";
            OleDbCommand comm = new OleDbCommand(update, this.cn);

            comm.Parameters.Add(new OleDbParameter("@id_login_entrega", idLogin));
            comm.Parameters.Add(new OleDbParameter("@vehiculo_kilom_i", elemento.kilometrajeIngreso));
            comm.Parameters.Add(new OleDbParameter("@vehiculo_llanta_rpto_in", elemento.vehiculo.llantaRpto));
            comm.Parameters.Add(new OleDbParameter("@vehiculo_escalera_g_in", elemento.vehiculo.escaleraGrande));
            comm.Parameters.Add(new OleDbParameter("@vehiculo_escalera_c_in", elemento.vehiculo.escaleraChica));
            //Persona
            comm.Parameters.Add(new OleDbParameter("@perNumDoc", elemento.persona.numDoc));
            comm.Parameters.Add(new OleDbParameter("@perApePat", elemento.persona.apePat));
            comm.Parameters.Add(new OleDbParameter("@perApeMat", elemento.persona.apeMat));
            comm.Parameters.Add(new OleDbParameter("@perNombres", elemento.persona.nombres));
            comm.Parameters.Add(new OleDbParameter("@perEmpresa", elemento.persona.empresa));

            //laptops
            comm.Parameters.Add(new OleDbParameter("@eqNumSerie1", elemento.vehiculo.equipoIn1.numSerie));
            comm.Parameters.Add(new OleDbParameter("@eqTipo1", elemento.vehiculo.equipoIn1.tipo));
            comm.Parameters.Add(new OleDbParameter("@eqMarca1", elemento.vehiculo.equipoIn1.marca));
            comm.Parameters.Add(new OleDbParameter("@eqModelo1", elemento.vehiculo.equipoIn1.modelo));

            comm.Parameters.Add(new OleDbParameter("@eqNumSerie2", elemento.vehiculo.equipoIn2.numSerie));
            comm.Parameters.Add(new OleDbParameter("@eqTipo2", elemento.vehiculo.equipoIn2.tipo));
            comm.Parameters.Add(new OleDbParameter("@eqMarca2", elemento.vehiculo.equipoIn2.marca));
            comm.Parameters.Add(new OleDbParameter("@eqModelo2", elemento.vehiculo.equipoIn2.modelo));

            comm.Parameters.Add(new OleDbParameter("@parObservOut", elemento.observacionesRev));
            comm.Parameters.Add(new OleDbParameter("@id", elemento.id));

            comm.ExecuteNonQuery();
        }
        public void salidaParticular(int id, int idLogin, Equipo equipo1, Equipo equipo2, String observOut)
        {
            String update = "update reg_vehiculo set salida=now,id_login_salida=?," +
                "num_serie_out1=?,tipo_out1=?,marca_out1=?,modelo_out1=?,"          +
                "num_serie_out2=?,tipo_out2=?,marca_out2=?,modelo_out2=?,observ_rev=? " +
                " where id=?";

            OleDbCommand comm = new OleDbCommand(update, this.cn);
            
            comm.Parameters.Add(new OleDbParameter("@id_login_entrega", idLogin));

            OleDbParameter parNumSerie1 = new OleDbParameter("@parNumSerie1", OleDbType.VarChar);
            parNumSerie1.Value = equipo1.numSerie;
            comm.Parameters.Add(parNumSerie1);

            OleDbParameter parTipo1 = new OleDbParameter("@parTipo1", OleDbType.VarChar);
            parTipo1.Value = equipo1.tipo;
            comm.Parameters.Add(parTipo1);

            OleDbParameter parMarca1 = new OleDbParameter("@parMarca1", OleDbType.VarChar);
            parMarca1.Value = equipo1.marca;
            comm.Parameters.Add(parMarca1);

            OleDbParameter parModelo1 = new OleDbParameter("@parModelo1", OleDbType.VarChar);
            parModelo1.Value = equipo1.modelo;
            comm.Parameters.Add(parModelo1);

            OleDbParameter parNumSerie2 = new OleDbParameter("@parNumSerie2", OleDbType.VarChar);
            parNumSerie2.Value = equipo2.numSerie;
            comm.Parameters.Add(parNumSerie2);

            OleDbParameter parTipo2 = new OleDbParameter("@parTipo2", OleDbType.VarChar);
            parTipo2.Value = equipo2.tipo;
            comm.Parameters.Add(parTipo2);

            OleDbParameter parMarca2 = new OleDbParameter("@parMarca2", OleDbType.VarChar);
            parMarca2.Value = equipo2.marca;
            comm.Parameters.Add(parMarca2);

            OleDbParameter parModelo2 = new OleDbParameter("@parModelo2", OleDbType.VarChar);
            parModelo2.Value = equipo2.modelo;
            comm.Parameters.Add(parModelo2);

            OleDbParameter parObservOut = new OleDbParameter("@parObservOut", OleDbType.VarChar);
            parObservOut.Value = observOut ;
            comm.Parameters.Add(parObservOut);

            OleDbParameter parId = new OleDbParameter("@id", OleDbType.BigInt);
            parId.Value = id;
            comm.Parameters.Add(parId);

            comm.ExecuteNonQuery();
        }
        public List<RegistroVehiculo> getByFec(DateTime fecha, int idLocal, bool propio)
        {
            List<RegistroVehiculo> elems = new List<RegistroVehiculo>();
            DateTime fecFin = fecha.AddDays(1);
            String spropio = " in ('V','P') ";
            String campo = "ingreso";
            if (propio)
            {
                spropio = " in ('C') "; ;
                campo = "salida";
            }
            String query = "SELECT id,salida,num_doc, ape_pat,ape_mat,nombres,empresa" +
                ",vehiculo_placa,vehiculo_descrip,vehiculo_llanta_rpto,vehiculo_escalera_g," +
                "vehiculo_escalera_c,vehiculo_kilom_s,observ, ingreso,vehiculo_kilom_i,propio," +
                " num_serie_in1,num_serie_out1,num_serie_in2,num_serie_out2, observ_rev " +
                " FROM " + 
                " reg_vehiculo where "+campo +">=? and "+campo + "<? and id_loc=? " +
                " and propio " + spropio +
                " order by id";
            OleDbCommand comm = new OleDbCommand(query, this.cn);

            comm.Parameters.Add(new OleDbParameter("fecha", OleDbType.Date, 0, "fecha"));
            comm.Parameters["fecha"].Value = fecha;

            comm.Parameters.Add(new OleDbParameter("fecFin", OleDbType.Date, 0, "fecFin"));
            comm.Parameters["fecFin"].Value = fecFin;

            comm.Parameters.Add(new OleDbParameter("id_loc", OleDbType.Numeric, 0, "id_loc"));
            comm.Parameters["id_loc"].Value = idLocal;

            OleDbDataReader dr = comm.ExecuteReader();
            while (dr.Read())
            {
                RegistroVehiculo elem = new RegistroVehiculo();
                elem.id = dr.GetInt32(0);
                if (!dr.IsDBNull(1))
                {
                    elem.salida = dr.GetDateTime(1);
                }
                elem.persona.numDoc = dr.GetString(2);
                elem.persona.apePat = dr.GetString(3);
                elem.persona.apeMat = dr.GetString(4);
                elem.persona.nombres = dr.GetString(5);
                elem.persona.empresa = dr.GetString(6);
                elem.vehiculo.placa = dr.GetString(7);
                elem.vehiculo.marca = dr.GetString(8);
                elem.vehiculo.llantaRpto = dr.GetInt16(9);
                elem.vehiculo.escaleraGrande = dr.GetInt32(10);
                elem.vehiculo.escaleraChica = dr.GetInt32(11);
                elem.vehiculo.ultimoKilometraje = dr.GetInt32(12);
                elem.kilometrajeSalida = dr.GetInt32(12);
                elem.vehiculo.tipo =dr.GetString(16);
                elem.observaciones = dr.GetString(13);
                if (!dr.IsDBNull(20))
                {
                    elem.observacionesRev = dr.GetString(20);
                }
                if (!dr.IsDBNull(14))
                {
                    elem.entrada = dr.GetDateTime(14);
                    if (elem.vehiculo.tipo.Equals("C"))
                    {
                        elem.kilometrajeIngreso = dr.GetInt32(15);
                    }
                }
                if (!dr.IsDBNull(17))
                {
                    elem.equipoIngresa1.numSerie = dr.GetString(17);
                }
                if (!dr.IsDBNull(18))
                {
                    elem.equipoSalida1.numSerie = dr.GetString(18);
                }
                if (!dr.IsDBNull(19))
                {
                    elem.equipoIngresa2.numSerie = dr.GetString(19);
                }
                if (!dr.IsDBNull(20))
                {
                    elem.equipoSalida2.numSerie = dr.GetString(20);
                }
                elems.Add(elem);
            }
            return elems;
        }
        public ArrayList reportePropios()
        {
            String query = "SELECT " +
                "id as [Id],salida as [Salida], num_doc as  [N° Doc# Sal], ape_pat as[Ape# Paterno Sal],"+
                "ape_mat as [Ape# Materno Sal],nombres as [Nombres Sal],empresa as [Empresa Sal]," +
                "num_doc_in as [N° Doc# In], ape_pat_in as [Ape# Paterno In],"+
                "ape_mat_in as [Ape# Materno In],nombres_in as [Nombres In],empresa_in as [Empresa In]," +
                "vehiculo_placa as [Placa],vehiculo_descrip as [Marca],vehiculo_llanta_rpto as [Llanta Rpto Sal]," +
                "vehiculo_escalera_g as [Escalera Sal],vehiculo_escalera_c as [Pernocta Sal]," +
                "vehiculo_llanta_rpto_in as [Llanta Rpto In],vehiculo_escalera_g_in as [Escalera In]," +
                "vehiculo_escalera_c_in as [Pernocta In]," +
                "vehiculo_kilom_s as [Kilom# Salida],observ as [Observ# Salida],"+
                "ingreso as [Ingreso],vehiculo_kilom_i as [Kilom# Ingreso]," +
                "num_serie_in1 as [Num# Serie In 1],num_serie_out1 as [Num# Serie Sal 1]," +
                "num_serie_in2 as [Num# Serie In 2],num_serie_out2 as [Num# Serie Sal 2]," +
                "observ_rev  as [Observ# Ingreso]" +
                " FROM " +
                " reg_vehiculo where " +
                " propio='C'";
            try
            {
                return getArrayListWithHeader(query);
            }
            catch (OleDbException ex)
            {
                throw new SystemException("Error al obtener reporte de vehículos corporativos", ex);
            }
        }
        public ArrayList reporteNoPropios()
        {
            String query = "SELECT id as [Id]," +
                "switch(propio='P','Propio',propio='V','Visita') as [Tipo]," +
                "ingreso as [Ingreso],num_doc as [N° Doc#],"+
                "ape_pat as [Ape# Paterno],ape_mat as [Ape# Materno],nombres as [Nombres],empresa as [Empresa]," +
                "vehiculo_placa as [Placa],vehiculo_descrip as [Marca],observ as [Observ# Ingreso], salida as [Salida]," +
                "num_serie_in1 as [Num# Serie In 1],num_serie_out1 as [Num# Serie Sal 1]," +
                "num_serie_in2 as [Num# Serie In 2],num_serie_out2 as [Num# Serie Sal 2]," +
                "observ_rev  as [Observ# Salida]" +
                " FROM " +
                " reg_vehiculo where " +
                " propio in ('P','V')";
            try
            {
                return getArrayListWithHeader(query);
            }
            catch (OleDbException ex)
            {
                throw new SystemException("Error al obtener reporte de vehículos No Corporativos", ex);
            }
        }
        public int getNoPropiosSinSalir()
        {
            string query = "select count(*) from reg_vehiculo where propio in ('P','V') and salida is null";
            try
            {
                return (int)getValUnico(query);
            }
            catch (OleDbException ex)
            {
                throw new SystemException("Error al obtener numero de vehiculos no propios sin salir", ex);
            }
        }
    }
}
